#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QGraphicsView(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);// 设置用户界面
    // 创建场景和设置视图
    m_scene = new QGraphicsScene;
    setScene(m_scene);
    m_scene->setSceneRect(3-width()/2,3-height()/2,width()-6,height()-6);

    // 创建小鸟
    m_bird = new Bird();
    m_scene->addItem(m_bird);
    m_bird->setPos(0,0);

    // 创建上下边界
    m_edge_1 = new Edge();
    m_scene->addItem(m_edge_1);
    m_edge_1->setPos(m_edge_1->boundingRect().width()/4,-height()/2+7);

    m_edge_2 = new Edge();
    m_scene->addItem(m_edge_2);
    m_edge_2->setPos(m_edge_2->boundingRect().width()/4,height()/2-7);
    m_edge_2->setRotation(180);
    m_edge_1->BeginMove();
    m_edge_2->BeginMove();


    hideButton();// 隐藏按钮

    // 创建游戏定时器
    m_timer = new QTimer(this);
    connect(m_timer,SIGNAL(timeout()),this,SLOT(beginBarrier()));

    // 当小鸟死亡时，调用槽函数 onBirdDied()
    connect(m_bird,SIGNAL(died()),this,SLOT(onBirdDied()));

    // 创建多个障碍物，并添加到场景中
    for(int i=0;i<BARRIER_NUM;i++)
    {
        m_barr[i] = new Barrier();
        m_scene->addItem(m_barr[i]);
    }
    initBarrier();// 初始化障碍物

    num = 0;// 计数器归零

    QTimer::singleShot(3000,this,SLOT(delayBegin()));// 在 3 秒后开始游戏

    score = 0;// 分数归零
    ScoringTimer = new QTimer(this);
    connect(ScoringTimer,SIGNAL(timeout()),this,SLOT(Scoring()));// 创建分数统计定时器，并连接到槽函数 Scoring()

    settings = new QSettings("score.ini",QSettings::IniFormat);// 创建 QSettings 对象，管理得分记录

    setWindowFlags(Qt::FramelessWindowHint);// 隐藏窗口标题栏，使窗口无边框
}

Widget::~Widget()//析构函数，删除 QSettings 对象和用户界面
{
    delete settings;
    delete ui;
}

void Widget::mousePressEvent(QMouseEvent *event)//鼠标按下事件，让小鸟飞起来
{//鼠标按下
    Q_UNUSED(event)
    m_bird->ClickToFlay();

}

void Widget::initBarrier() //初始化障碍物位置
{
    for(int i=0;i<BARRIER_NUM;i++)
    {
        //上层障碍
        if(i%2==0)
        {
            m_barr[i]->isMain = true;
            m_barr[i]->setPos(EDGE_BOUNDING.width()/4+BARRIER_BOUNDING.width()/2,
                              -BARRIER_BOUNDING.height()/2-OK_WIDTH/2);
            m_barr[i]->lastPos = m_barr[i]->pos();
        }
        //下层障碍
        else
        {
            m_barr[i]->setPos(EDGE_BOUNDING.width()/4+BARRIER_BOUNDING.width()/2,
                              BARRIER_BOUNDING.height()/2+OK_WIDTH/2);
            m_barr[i]->lastPos = m_barr[i]->pos();
        }
    }
}

void Widget::beginBarrier()//开始障碍物移动
{
    if(num == BARRIER_NUM/2)
    {
        m_timer->stop();
        return;
    }
    m_barr[2*num]->BeginMove();
    m_barr[2*num+1]->BeginMove();
    num++;

}

void Widget::showButton() //显示按钮
{
    ui->pushButton->show();
    ui->pushButton_2->show();
    ui->label->show();
    ui->label_4->show();
    ui->label_2->show();
    ui->label_3->show();
}

void Widget::hideButton() //隐藏按钮
{
    ui->pushButton->hide();
    ui->pushButton_2->hide();
    ui->label->hide();
    ui->label_4->hide();
    ui->label_2->hide();
    ui->label_3->hide();
}

void Widget::onBirdDied() //小鸟死亡并记录分数
{
    showButton();//显示重新开始和退出按钮
    ScoringTimer->stop();//停止得分定时器
    ui->label_2->setText(QString::number(score));//将分数显示在界面上
    if(settings->value("score").toInt()<score)//如果当前分数大于最高分，则更新最高分
    {
        settings->setValue("score",score);//将最高分保存在QSettings中
        ui->label_4->setText(QString::number(score));//将最高分显示在界面上
    }else
    {
        ui->label_4->setText(QString::number(settings->value("score").toInt()));//如果当前分数不是最高分，则显示最高分
    }
    score = 0;//重置分数
    scene()->update(scene()->sceneRect());//刷新场景
}

void Widget::on_pushButton_clicked()//重新开始游戏，将障碍物和小鸟都复位
{
    num = 0;
    initBarrier();
    m_bird->reBegin();
    m_bird->setPos(0,0);
    for(int i=0;i<BARRIER_NUM;i++)
    {
        m_barr[i]->reBegin();
    }
    hideButton();//隐藏重新开始和退出按钮
    QTimer::singleShot(3000,this,SLOT(delayBegin()));//延迟3秒后开始游戏
    scene()->update(scene()->sceneRect());//刷新场景
}

void Widget::Scoring()//得分
{
    score++;
}

void Widget::delayBegin()//延时开始
{//根据速度和场景大小计算定时器周期，启动游戏
    m_timer->start((EDGE_BOUNDING.width()/2+BARRIER_BOUNDING.width())/BARRIER_NUM*2/SPEED*1000);
    ScoringTimer->start((EDGE_BOUNDING.width()/2+BARRIER_BOUNDING.width())/BARRIER_NUM*2/SPEED*1000);
}

void Widget::on_pushButton_2_clicked() //退出
{
    close();//关闭游戏窗口
}
